package com.tyam.dao;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Restrictions;
import com.tyam.bean.Usuario;

public class UsuarioDAOHibernate implements UsuarioDAO {

	HibernateDAOFactory hibernateDAOFactory = null;
	HibernateDAO<Usuario> hibernateDAO = null;

	public UsuarioDAOHibernate() {
		hibernateDAOFactory = new HibernateDAOFactory();
		hibernateDAO = hibernateDAOFactory.getUsuarioDAO();
	}
	
	@Override
	public boolean inserir(Usuario usuario) throws Exception {
		boolean ok = false;

		try {
			hibernateDAO.add(usuario);
			ok = true;
		} catch (Exception e) {
			throw new Exception(e.getMessage());
		} 
		return ok;
	}

	@Override
	public boolean alterar(Usuario usuario) throws Exception {
		boolean ok = false;

		try {
			hibernateDAO.update(usuario);
			ok = true;
		} catch (Exception e) {
			throw new Exception(e.getMessage());
		}

		return ok;
	}

	@Override
	public boolean excluir(Usuario usuario) throws Exception {
		boolean ok = false;

		try {
			hibernateDAO.remove(usuario);
			ok = true;
		} catch (Exception e) {
			throw new Exception(e.getMessage());
		} 

		return ok;
	}
	
	@SuppressWarnings("unchecked")
	@Override
	public List<Usuario> getSelecionar(String nome) {
		 
		
	    Criteria criteria = hibernateDAO.getSession().createCriteria(Usuario.class);
	    criteria.add(Restrictions.like("nome",nome, MatchMode.ANYWHERE));
	    List<Usuario> lista = criteria.list();

		return lista;
	}	

	@Override
	public Usuario getUsuario(int codigoUsuario) {
		return hibernateDAO.get(codigoUsuario);
	}

	@Override
	public List<Usuario> getListarTodos() {
		return hibernateDAO.listAll();
	}
	
	@Override
	public boolean isExiste(Usuario usuario) {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public boolean isExclusaoLiberada(Usuario usuario) {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public Usuario getUsuario(String login) {
		
		String 	sql = "FROM Usuario as usuario WHERE usuario.codigoUsuario <> 0";

		if (!(login.isEmpty())) {
			sql += " AND usuario.login = '" + login + "' ";  
		}
		
		sql += " ORDER BY usuario.codigoUsuario";		
 
		Usuario usuario = (Usuario) hibernateDAO.getSession().createQuery(sql).uniqueResult();
				
		return usuario;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Usuario> getSelecionar(String nome, int codigoEmpresa) {
		String 	sql = " SELECT usuario " +
				      " FROM Usuario as usuario " +
				      " JOIN usuario.empresas as empresa "+
				      " WHERE usuario.codigoUsuario <> 0 ";

		if (!(nome.isEmpty())) {
			sql += " AND usuario.nome like '" + nome + "%' ";  
		}
		
		sql += " AND empresa.codigoEmpresa = "+codigoEmpresa;
		sql += " ORDER BY usuario.nome";		
 
		List<Usuario> lista = hibernateDAO.getSession().createQuery(sql).list();
		
		return lista;
	}

	@Override
	public Usuario getUsuario(String login, int codigoEmpresa) {
		
		String 	sql =  " SELECT usuario ";
				sql += " FROM Usuario as usuario ";
				sql += " JOIN usuario.empresas as empresa ";
				sql += " WHERE usuario.login = '" + login + "' ";  
				sql += "   AND empresa.codigoEmpresa = "+codigoEmpresa;
				sql += " ORDER BY usuario.codigoUsuario";		
	 
		Usuario usuario = (Usuario) hibernateDAO.getSession().createQuery(sql).uniqueResult();
					
		return usuario;		  
	}

	@Override
	public void inicialize(Usuario usuario) {
		if (usuario != null){
			Usuario usr = DAOFactory.getUsuarioDAO().getUsuario(usuario.getCodigoUsuario());
			usuario.setEmpresas(usr.getEmpresas());
		}
		
	}	

}
